/*
 * @Author: wwssaabb
 * @Date: 2021-11-04 17:26:16
 * @LastEditTime: 2021-11-05 15:04:41
 * @FilePath: \handwritten-code\demo\数组扁平化.js
 */

//所谓扁平化就是将多维数组变成一维数组
let arr = [1, 2, 3, [1, 2, 3, null], () => {}, undefined, new Date(), /abc/g, {}]

//方法一：利用JSON对象+字符串替换'['、']'为''
//缺点：不支持undefined、正则、Date对象、函数，JSON的原因
function flat(arr) {
  return JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']')
}

//方法二：使用Array.flat 
//缺点：兼容问题，ES6及以上
arr.flat(Infinity)

//方法三：递归
function flat(target) {
  if (!Array.isArray(target)) return target
  let arr = []
  target.forEach(i => {
    arr.push(Array.isArray(i) ? flat(i) : i)
  })
  return arr
}

//方法三：reduce+递归
function flat(arr) {
  if (!Array.isArray(arr)) return arr
  return arr.reduce((p, c) => {
    return p.concat(Array.isArray(c) ? flat(c) : c)
  }, [])
}


//总结：
//方法一：JSON转换成字符串，然后替换[]
//方法二：使用array.flat
//方法一：递归